package com.alstudio.module.xmpp.protocol.xmpp;

import java.util.HashMap;

import com.alstudio.module.xmpp.protocol.xmpp.packact.ALIQ;
import com.alstudio.module.xmpp.protocol.xmpp.packact.ALMessage;
import com.alstudio.module.xmpp.protocol.xmpp.packact.IQNameSpace;
import com.alstudio.module.xmpp.protocol.xmpp.packact.Presence;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.ALIQPackageCallback;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.loadmore.LoadMoreReusltParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.money.ClearMoneyOrPointsHistoryParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.money.GetMoneyOrPointsHistoryParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.money.RechargePriceParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.money.UserPointsParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.props.ActivePropsParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.props.DeleteUserPropsBuyHistoryParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.props.PropsListParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.props.PropsPriceParesr;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.props.UserPropsBuyHistoryParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.props.UserPropsListParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.rank.CheckUserRankingRankParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.register.CheckThirdPartLoginStateParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.register.EmailCheckParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.register.RegisterSystemAccountParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.system.XmppPingPackactParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.BindEmailParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.BindEmailSuccessParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.ChangePasswordParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.CheckVauthStateParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.CommitUserOptionParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.FeedBackIQPackactParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.GetUserOptionParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.SendFeedBackParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.useroption.StartVauthParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.AddNormalOrSpecailFavoritesParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.CheckBlackListParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.DeleteFriendOrFansResultParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.GetUserProfileResultParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.GlobalSearchResultParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.ModifyUserProfileParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.usersaction.SetUserNoteNameParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.AcceptVoipCallParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.CheckVoipCallPirceListParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.DeleteVoipCallHistoryDetailParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.EnterBaoMiHuaParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.EnterXiehouParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.ExitBaoMiHuaParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.HandUpVoipCallParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.MakeVoipCallParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.RejectVoipCallParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.iq.voip.SetVoipCallPriceParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.message.ALMessageParser;
import com.alstudio.module.xmpp.protocol.xmpp.parser.presence.ALPresenceParser;
import com.alstudio.utils.log.ALLog;

/**
 * 本类用于注册IQ,ALMessage、Presence解析器。
 * 
 * @author alonso lee
 * 
 */
public class ALXmppParseConfigue {

	/**
	 * 用于注册IQ流解析器
	 */
	private HashMap<String, ALIQPackageCallback> map = new HashMap<String, ALIQPackageCallback>();

	public ALXmppParseConfigue() {
		registerIQParseMethod();
	}

	/**
	 * 注册指定命名空间的IQ解析器
	 */
	public void registerIQParseMethod() {

		// 注册
		map.put(IQNameSpace.NS_REGISTER, new RegisterSystemAccountParser() {
		});
		// 检测邮箱是否注册
		map.put(IQNameSpace.NS_EMAIL_CHECK, new EmailCheckParser() {
		});
		// 检测第三方是否注册
		map.put(IQNameSpace.NS_THIRD_PART_LOGIN,
				new CheckThirdPartLoginStateParser() {
				});

		// 反馈
		map.put(IQNameSpace.NS_SUGGEST, new FeedBackIQPackactParser() {
		});
		// ping包
		map.put(IQNameSpace.NS_URN_XMPP_PING, new XmppPingPackactParser() {
		});

		/******************************* voip *************************************/
		map.put(IQNameSpace.NS_MAKE_VOIP_CALL, new MakeVoipCallParser() {
		});
		map.put(IQNameSpace.NS_ACCEPT_CALL, new AcceptVoipCallParser() {
		});
		map.put(IQNameSpace.NS_REJECT_CALL, new RejectVoipCallParser() {
		});
		map.put(IQNameSpace.NS_HAND_UP_CALL, new HandUpVoipCallParser() {
		});
		// 邂逅
		map.put(IQNameSpace.NS_XIE_HOU, new EnterXiehouParser() {
		});

		// 进入爆米花
		map.put(IQNameSpace.NS_BAO_MI_HUA_ENTER, new EnterBaoMiHuaParser() {
		});
		// 退出爆米花
		map.put(IQNameSpace.NS_BAO_MI_HUA_QUIT, new ExitBaoMiHuaParser() {
		});

		// 请求陌生人通话记录
		map.put(IQNameSpace.NS_VOIP_RECORD_WITH_STRANGER,
				new LoadMoreReusltParser() {
				});
		// 请求好友通话记录
		map.put(IQNameSpace.NS_VOIP_RECORD_WITH_FRIENDS,
				new LoadMoreReusltParser() {
				});
		// 请求爆米花通话记录
		map.put(IQNameSpace.NS_VOIP_RECORD_WITH_BAOMIHUA,
				new LoadMoreReusltParser() {
				});

		// 请求設置通話價格
		map.put(IQNameSpace.NS_SET_VOIP_CALL_PRICE,
				new SetVoipCallPriceParser() {
				});
		// 请求通話價格列表
		map.put(IQNameSpace.NS_VOIP_CALL_PRICE_LIST,
				new CheckVoipCallPirceListParser() {
				});

		// 请求普通电话通话详情
		map.put(IQNameSpace.NS_VOIP_CALL_HISTORY_DETAIL,
				new LoadMoreReusltParser() {
				});
		// 删除通话记录详情
		map.put(IQNameSpace.NS_VOIP_CALL_HISTORY_DETAIL_DELETE,
				new DeleteVoipCallHistoryDetailParser() {
				});

		/******************************** 用戶相關操作 **********************************/

		// 发现
		map.put(IQNameSpace.NS_DISCOVERY, new LoadMoreReusltParser() {
		});
		// 搜索
		map.put(IQNameSpace.NS_SEARCH, new GlobalSearchResultParser() {
		});

		// 魅力榜
		map.put(IQNameSpace.NS_RANKING_GLAMOUR, new LoadMoreReusltParser() {
		});

		// 富豪榜
		map.put(IQNameSpace.NS_RANKING_RICH, new LoadMoreReusltParser() {
		});
		// 女神榜
		map.put(IQNameSpace.NS_RANKING_SEXY, new LoadMoreReusltParser() {
		});

		// 排行榜排名
		map.put(IQNameSpace.NS_RANKING_RANK, new CheckUserRankingRankParser() {
		});

		// 好友列表
		map.put(IQNameSpace.NS_FAVORITES_LIST, new LoadMoreReusltParser() {
		});

		// 粉丝列表
		map.put(IQNameSpace.NS_FANS_LIST, new LoadMoreReusltParser() {
		});

		// 相互关注

		map.put(IQNameSpace.NS_FAVORITES_EACH_OTHER,
				new LoadMoreReusltParser() {
				});

		// 个人资料
		map.put(IQNameSpace.NS_USER_PROFILE, new GetUserProfileResultParser() {
		});

		// 修改个人资料
		map.put(IQNameSpace.NS_MODIFY_USER_PROFILE,
				new ModifyUserProfileParser() {
				});

		// 删除粉丝
		map.put(IQNameSpace.NS_DELETE_FANS,
				new DeleteFriendOrFansResultParser() {
				});

		// 删除好友
		map.put(IQNameSpace.NS_DELETE_FAVORITE,
				new DeleteFriendOrFansResultParser() {
				});

		// 关注好友
		map.put(IQNameSpace.NS_ADD_FAVORITES,
				new AddNormalOrSpecailFavoritesParser());

		// 特别关注好友
		map.put(IQNameSpace.NS_ADD_FAVORITES_SPECIAL,
				new AddNormalOrSpecailFavoritesParser());

		// 取消特别关注好友
		map.put(IQNameSpace.NS_DELETE_FAVORITES_SPECIAL,
				new DeleteFriendOrFansResultParser());

		// 请求设置好友备注名
		map.put(IQNameSpace.NS_ADD_NOTE_NAME, new SetUserNoteNameParser());

		// // 请求加入黑名单
		// map.put(IQNameSpace.XMPP_ADD_USER_TO_BLACK_LIST_REQUEST,
		// new AddUserToBlackListRequestProccesser());
		//
		// // 请求解除黑名单
		// map.put(IQNameSpace.XMPP_DELETE_USER_TO_BLACK_LIST_REQUEST,
		// new DeleteUserFromBlackListRequestProccesser());

		/**
		 * 请求黑名单
		 */
		map.put(IQNameSpace.NS_BLACK_LIST, new CheckBlackListParser());

		/******************************** 賬號設置 *************************************************/

		// 请求更改密码
		map.put(IQNameSpace.NS_CHANGE_PWD, new ChangePasswordParser());
		// 请求上傳用戶配置文件
		map.put(IQNameSpace.NS_COMMIT_USER_OPTION, new CommitUserOptionParser());
		// 请求獲取用戶配置文件
		map.put(IQNameSpace.NS_GET_USER_OPTION, new GetUserOptionParser());
		// 请求發送反饋意見
		map.put(IQNameSpace.NS_SUGGEST, new SendFeedBackParser());

		// 请求V认证状态
		map.put(IQNameSpace.NS_CHECK_VAUTH_STATE, new CheckVauthStateParser());

		// 请求加V认证结果
		map.put(IQNameSpace.NS_START_VAUTH, new StartVauthParser());

		// 请求绑定邮箱结果
		map.put(IQNameSpace.NS_BIND_EMAIL, new BindEmailParser());

		// 邮箱绑定成功通知
		map.put(IQNameSpace.NS_BIND_EMAIL_SUCCESS, new BindEmailSuccessParser());
		
		// 邮箱绑定再发一封
		map.put(IQNameSpace.NS_BIND_EMAIL_AGAIN, new BindEmailSuccessParser());

		/*********************************** 經濟系統 **********************************************/
		// 請求獲取充值價格列表
		map.put(IQNameSpace.NS_GET_RECHARGE_PRICE_LIST,
				new RechargePriceParser());
		// 請求獲取消費記錄
		map.put(IQNameSpace.NS_GET_USER_MONEY_HISTORY,
				new GetMoneyOrPointsHistoryParser());
		// 請求刪除消費記錄
		map.put(IQNameSpace.NS_DELETE_MONEY_HISTORY,
				new ClearMoneyOrPointsHistoryParser());
		// 請求獲取積分
		map.put(IQNameSpace.NS_GET_USER_POINTS, new UserPointsParser());
		// 請求獲取積分記錄
		map.put(IQNameSpace.NS_GET_POINT_HISTORY,
				new GetMoneyOrPointsHistoryParser());
		// 請求刪除積分記錄
		map.put(IQNameSpace.NS_DELETE_USER_POINTS,
				new ClearMoneyOrPointsHistoryParser());

		/************************************** 道具系统 *****************************************************/
		// 請求刪除道具购买記錄
		map.put(IQNameSpace.NS_USER_PROPS_HISTORY_DELET,
				new DeleteUserPropsBuyHistoryParser());

		// 請求用户道具购买記錄
		map.put(IQNameSpace.NS_USER_PROPS_HISTORY_LIST,
				new UserPropsBuyHistoryParser());

		// 請求用户道具
		map.put(IQNameSpace.NS_USER_PROPS_LIST, new UserPropsListParser());

		// 請求道具价格
		map.put(IQNameSpace.NS_PROPS_PRICE, new PropsPriceParesr());

		// 請求道具商城道具列表
		map.put(IQNameSpace.NS_PROPS_LIST, new PropsListParser());

		// 激活道具
		map.put(IQNameSpace.NS_ACTIVE_PROPS, new ActivePropsParser());

	}

	public void registerMessageParseMethod() {

	}

	public void registerPresenceParseMethod() {

	}

	public synchronized void getIQParser(ALIQ packact, String stream,
			ALXmppEventListener listener) {
		if (map.get(packact.getNameSpace()) != null) {
			ALIQPackageCallback callback = map.get(packact.getNameSpace());
			ALLog.d("开始解析" + packact.getNameSpace());
			try {
				callback.parseIQPackage(packact, stream, listener);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public synchronized void getMessageParser(ALMessage msg, String stream,
			ALXmppEventListener listener) {
		ALMessageParser parser = new ALMessageParser(msg, stream, listener);
		parser.startParseALMessage();
	}

	public synchronized void getALPresenceParser(Presence presence,
			String stream, ALXmppEventListener listener) {
		ALPresenceParser parser = new ALPresenceParser(presence, stream,
				listener);
		parser.startParsePresence();
	}

}
